home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-06 / charon40.zip / TXT2PS.C < prev    next >
Text File  |  1992-03-18  |  5KB  |  253 lines

  1. /* txt2ps translator for use with Charon
  2.     Copyright (C) 1990 Brad K. Clements, Clarkson University
  3.            All Rights Reserved.
  4.  
  5.     Portions based on Textps.c by Eric Gisin, egisin@waterloo.csnet             
  6.     
  7.  
  8.  
  9. */
  10.  
  11. #include <ctype.h> 
  12. #include <time.h>
  13. #include <string.h>
  14. #define    STANDALONE    0
  15. #include "callback.h"
  16. #include "tagvalue.h"
  17.  
  18. char    *stackinfo="$STACKSIZE:4096";
  19. #define    BUFFSIZE    1024
  20. #define    OBUFFSIZE    1024
  21. #define    FONTSIZE    12
  22. #define    MAX_LINE_LENGTH    256
  23. char *Head1[] = {
  24.     "%!PS-Adobe-1.0\n",
  25.     "%%Creator: text_ps.c\n",
  26.     "%%DocumentFonts: Courier, Helvetica, Times-Roman\n",
  27.     NULL};
  28.  
  29. char *Head2[] = {
  30.     "/S {fontsize mul 780 exch sub 0 exch moveto show} def\n",
  31.     "/P+ {/Save save def M concat} def\n",
  32.     "/P- {showpage Save restore} def\n",
  33.     NULL};
  34.  
  35. char *Mdef[] = {"/M [1 0 0 1 18 0] def \n", "/M [0 -.727 0.727 0 21 737] def\n"};
  36.  
  37.  
  38. int    Choose();
  39. long    start, end, bytes;
  40. int    nobanner;            /* when true, disable banner flag */
  41.  
  42. int
  43. main(int argc, char *argv[])
  44. {
  45.     int     rc;
  46.     unsigned    header_flags;
  47.     char        ibuffer[32], *c;
  48.  
  49.     for(rc=0; rc < argc; rc++) {
  50.                if(!strcmp(argv[rc],"-nobanner"))
  51.                    nobanner = 1;
  52.     }
  53.     if(nobanner && (c = getenv(TV_CFlags))) {    /* clear banner page flags */
  54.            header_flags = atoi(c);
  55.            header_flags &= ~TVCF_BANNER;    /* clear banner flag */    
  56.            sprintf(ibuffer,"%s=%u",TV_CFlags, header_flags);
  57.            setenv(ibuffer);
  58.        }
  59.  
  60.     if(!Choose()) 
  61.                return(RT_CHANGED_TAGS);    /* even if we didn't change the text, don't do banners */
  62.  
  63.     time(&start);
  64.     Translate();
  65.     time(&end);
  66.     fprintf(STDERR,"Translated %ld input bytes, %ld output bytes in %d seconds\n",bytes, tellp(STDOUT), (int) end-start);
  67.     return(RT_OK|RT_CHANGED_TEXT);
  68. }
  69.  
  70.  
  71. int
  72. Choose()
  73. {
  74.     char    *c;
  75.     char    buffer[1024];
  76.     int    count;
  77.     int    mode = 0;
  78.     int    rc = 1;
  79.  
  80.     /* the choose function examines the input buffer, looking for the
  81.        first series of non-whitespace characters. If the first non
  82.        whitespace character set is not  %! then we know that this is
  83.        not a PostScript file. 
  84.     */
  85.     seekp(STDIN, 0, SEEK_SET);
  86.  
  87.     count = read(STDIN, buffer, 1024);
  88.     for(c=buffer; count > 0; count--, c++) {        /* into loop if char c is valid */
  89.         if(isascii(*c) && isspace(*c))
  90.             continue;
  91.         switch( mode ) {
  92.  
  93.             case 0 :    /* looking for % */
  94.                 if(*c != '%') {
  95.                     rc = 1;
  96.                     goto out;
  97.                 }
  98.                 mode++;
  99.                 break;
  100.             case 1 :    /* looking for ! */
  101.                 if(*c == '!') 
  102.                     rc = 0;
  103.                 else
  104.                            rc = 1;
  105.                 goto out;
  106.         };
  107.     }    /* end while */
  108. out:;
  109.     seekp(STDIN, 0, SEEK_SET);
  110.     return(rc);    /* nothing but blanks so far */
  111. }
  112.  
  113.  
  114. int
  115. Translate()
  116. {
  117.     int    x;
  118.     char    *c;
  119.     int    copies = 1;
  120.     int    sequence;
  121.     int    page = 0;
  122.     int    fontsize;
  123.     int     LineNumFlag;
  124.     int    rownum = 1;
  125.     int    pagelength = 66;
  126.     int    wide = 0;
  127.     int    row;
  128.     int    col = 0;
  129.     int    writeptr;
  130.     int    savec;
  131.     char    line[MAX_LINE_LENGTH];
  132.     char    ibuffer[BUFFSIZE];
  133.     int    count;
  134.     int    eof = 0;
  135.     unsigned header_flags;
  136.  
  137.     bytes = 0;
  138.     if(c = getenv(TV_CCopies)) {
  139.         copies = atoi(c);
  140.         if(!copies)
  141.             copies = 1;
  142.         sprintf(ibuffer,"%s=1",TV_CCopies);
  143.         setenv(ibuffer);
  144.     }
  145.     for(x=0; Head1[x] != NULL; x++)
  146.         write(STDOUT, Head1[x], strlen(Head1[x]));
  147.  
  148.     write(STDOUT, Mdef[wide], strlen(Mdef[wide]));
  149.  
  150.     fprintf(STDOUT,"/#copies %d def\n",copies);
  151.     fprintf(STDOUT,"/fontsize %d def\n",FONTSIZE);
  152.     /* select font here */
  153.     fprintf(STDOUT,"/Courier ");
  154.  
  155.     fprintf(STDOUT,"findfont fontsize scalefont setfont\n");
  156.     for(x=0; Head2[x] != NULL; x++) {
  157.                write(STDOUT, Head2[x], strlen(Head2[x]));
  158.     }
  159.  
  160.     row = rownum;
  161.     while(!eof) {
  162.                count = read(STDIN, ibuffer, BUFFSIZE);
  163.         if(count == -1)
  164.             break;
  165.         if(count < BUFFSIZE)
  166.                    eof = 1;        /* next read will be end */
  167.         bytes += count;
  168.         for(c = ibuffer; count; count--, c++) {
  169.             switch(*c) {
  170.  
  171.                     case -1 :
  172.                 case '\r':
  173.                     break;
  174.                 case '\n' :
  175.                 case '\f' :
  176. leave:;
  177.                            if(*c == -1 && row == rownum)
  178.                                return(0);
  179.                     if(row == rownum) {
  180.                         page++;
  181.                         fprintf(STDOUT,"%%%%Page: ? %d\nP+\n",page);
  182.                     }
  183.                     if(col > 0) {
  184.                         line[col < MAX_LINE_LENGTH ? col : MAX_LINE_LENGTH] = 0;
  185.                         putstring(line);
  186.                         fprintf(STDOUT, "%d S\n", row);
  187.                     }
  188. scan:;
  189.                     if(*c == '\n')
  190.                         row++;
  191.                     if(row == pagelength || *c == '\f' || *c == -1) {
  192.                         row = rownum;
  193.                         fprintf(STDOUT,"P-\n");
  194.                     }
  195.                     if(*c == -1) {
  196.                         return(0);
  197.                     }
  198.                     col = 0;
  199.                     break;
  200.                 case '\t' :
  201.                     while(col < MAX_LINE_LENGTH) {
  202.                         line[col++] = ' ';
  203.                         if(col % 8 == 0)
  204.                             break;
  205.                     }
  206.                     break;
  207.                 case '\b' :
  208.                     if(col)
  209.                         col--;
  210.                     break;
  211.                 default : 
  212.                     if(col < MAX_LINE_LENGTH)   
  213.                         line[col++] = isascii(*c) && isprint(*c) ? *c : ' ';
  214.                     break;
  215.             } /* end c switch */
  216.  
  217.         } /* end for */
  218.        }    /* end !eof */
  219.     c = ibuffer;
  220.     *c = -1;
  221.     goto leave;
  222.  
  223. }
  224.  
  225. int
  226. putstring(register char *s)
  227. {
  228.     register c;
  229.     char    buffer[512];
  230.     char    *x, *limit;
  231.  
  232.     x = buffer;
  233.     limit = x + 509;
  234.  
  235.     *x++ = '(';
  236.     while((c = *s++)!= '\0') {
  237.          if(c=='\\' || c == '(' || c == ')')
  238.         *x++ = '\\';
  239.       *x++ = c;
  240.       if(x > limit) {
  241.              write(STDOUT, buffer, x - buffer);
  242.             x = buffer;
  243.       }
  244.     }
  245.     *x++ = ')';
  246.     write(STDOUT, buffer, x - buffer);
  247.     return(0);
  248. }
  249.  
  250.  
  251.  
  252.  
  253.